﻿using System;
using System.Collections.Generic;
using System.Text;
using LibParasInject;
using System.IO;

namespace ParasInject
{
    class Program
    {
        static string _tracer = string.Empty;
        static string _dirOut = string.Empty;
        static List<string> _bins = null;
        static List<string> _resolvers = null;

        static int Main (string[] args)
        {
            try
            {
                parseArgs   (args);
                validarArgs ();
            }
            catch (Exception exx)
            {
                Con2.showErrLine(exx.Message, ConsoleColor.Red);
                usage();
                return -1;
            }

            // creo el dirOut si no existe..
            // la LibParasInject tambien lo hace, pero aca lo necesito antes
            // de llamarla..
            crearDirOut();
            
            // copia el archivo parasiconfig.txt al dirOut
            copiarConfig (_dirOut);

            Injector injector = new Injector();
            injector.inject(_tracer, _dirOut, _bins, _resolvers);

            return 0;
        }

        private static void crearDirOut()
        {
            if (! Directory.Exists(_dirOut))
                Directory.CreateDirectory(_dirOut);
        }

        private static void copiarConfig (string dirOut)
        {
            char   sep = Path.DirectorySeparatorChar;
            string cfg = "parasiconfig.txt";
            string dst = dirOut + sep + cfg;

            if (! File.Exists(dst))
                File.Copy(cfg, dst);
        }

        static void parseArgs(string[] args)
        {
            var currentOption = string.Empty;

            foreach (var arg in args)
            {
                if (arg.StartsWith("-"))
                {
                    currentOption = arg.Replace("-", string.Empty);                    
                    // aca se puede trabajar con las opciones sin parámetro
                }
                else
                {
                    // aca se trabaja con el parámetro de las opciones con parámetro
                    switch (currentOption)
                    { 
                        case "parasitracer":
                        case "p":
                            _tracer = arg;
                            break;

                        case "dirout":
                        case "o":
                            _dirOut = arg;
                            break;

                        case "bins":
                        case "b":
                            if (_bins == null)
                                _bins = new List<string>();
                            _bins.Add(arg);
                            break;

                        case "resolvers":
                        case "r":
                            if (_resolvers == null)
                                _resolvers = new List<string>();
                            _resolvers.Add(arg);
                            break;
                    }
                }
            }
        }

        static void usage()
        {
            // muestro como se usa esta mierda...
            // -p "..\..\..\ParasiTracer\ParasiTracer\bin\Debug\ParasiTracer.dll"
            // -o "..\..\..\UnProgConsola\UnProgConsola\bin\Debug\ParasiOut"
            // -b "..\..\..\UnProgConsola\UnProgConsola\bin\Debug\UnProgConsola.exe"

            #if DEBUG
            Console.WriteLine(
                "(DEBUG) Presione una tecla para continuar..."
            );
            Console.ReadLine();
            #endif
        }

        static void validarArgs ()
        {
            if (_tracer == string.Empty)
                throw new Exception(
                    "El path del parasitracer (opción -p) no fue especificado!"
                );

            if (_dirOut == string.Empty)
                throw new Exception(
                    "El path de salida (opción -o) no fue espeficicado!"
                );

            if (_bins.Count < 1)
                throw new Exception(
                    "Debe haber por lo menos un binario para transformar (opción -b)"
                );
        }
    }
}
